//
// Created by Jisam on 2024年11月16日21:46:11.
// Solution of  D. Penchick and Desert Rabbit
#include <bits/stdc++.h> // 包含C++标准库

#define int long long // 将int定义为long long，以支持更大的整数
#define endl "\n" // 定义endl为换行符，方便输出
#define all(x) (x).begin(),(x).end() // 定义all(x)为x的迭代器范围，方便循环遍历
#define pb push_back // 定义pb为push_back，方便向向量添加元素
using namespace std; // 使用标准命名空间

void solve(){
    int n; // 定义n，表示树的数量
    cin >> n; // 读取树的数量
    vector<int> a(n); // 创建一个向量a，存储每棵树的高度
    for(int i = 0 ; i < n ; i ++){
        cin >> a[i]; // 读取每棵树的高度
        a[i] --; // 将高度减1，因为题目中的高度是从1开始的，而数组是从0开始的
    }

    vector<int> pref(n + 1, -1); // 创建一个向量pref，存储前缀最大值
    for(int i = 0 ; i < n ; i ++ ){
        pref[i + 1] = max(pref[i], a[i]); // 更新前缀最大值
    }

    vector<int> suf(n + 1, n + 1); // 创建一个向量suf，存储后缀最小值
    for(int i = n - 1;i >= 0; i --){
        suf[i] = min(suf[i + 1], a[i]); // 更新后缀最小值
    }

    vector<int> b(n,-1); // 创建一个向量b，存储从每棵树开始能跳到的最大高度
    int last = -1; // 定义last，记录上一个满足条件的树的索引

    for(int i = 0;i < n ; i ++){
        if(pref[i + 1] <= suf[i + 1]){ // 如果前缀最大值小于等于后缀最小值，则满足条件
            for(int j = last + 1;j <= i;j ++){
                b[j] = pref[i + 1]; // 更新b，记录能跳到的最大高度
            }
            last = i; // 更新last
        }
    }

    for(int i = 0 ; i < n ; i ++){
        cout << b[i] + 1 << " \n"[i == n - 1]; // 输出结果，将高度加1，因为之前减了1
    }
}

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false); // 关闭同步，提高输入输出效率
    int _; // 定义_，表示测试用例的数量
    cin >> _; // 读取测试用例的数量
    while(_ --){ // 对每个测试用例
        solve(); // 调用solve函数
    }
    return 0; // 返回0，表示程序正常结束
}